get_descriptives <- function(dat, 
                             mfx_vars, 
                             mod_var, 
                             reg_var, 
                             ud_var = NULL,
                             num_breaks) {
  desc_dat <- dat %>%
    dplyr::select(any_of(mfx_vars),
                  any_of(mod_var),
                  any_of(reg_var),
                  any_of(ud_var))
  
  ## Pre-group
  if (length(reg_var) > 0 & length(ud_var) == 0) {
    desc_dat <- desc_dat %>%
      group_by(!!as.name(reg_var))
  } else if (length(reg_var) > 0 & length(ud_var) > 0) {
    desc_dat <- desc_dat %>%
      group_by(!!as.name(reg_var), !!as.name(ud_var))
  } else if (length(reg_var) == 0 & length(ud_var) > 0) {
    desc_dat <- desc_dat %>%
      group_by(!!as.name(ud_var))
  }
  
  ## Numeric
  desc_dat_num <- desc_dat %>%
    dplyr::select_if(is.numeric) %>%
    gather(key = "variable", value = "value",-any_of(reg_var),-any_of(ud_var))
  
  if (length(reg_var) > 0 & length(ud_var) == 0) {
    desc_dat_num <- desc_dat_num %>%
      group_by(!!as.name(reg_var), variable)
  } else if (length(reg_var) > 0 & length(ud_var) > 0) {
    desc_dat_num <- desc_dat_num %>%
      group_by(!!as.name(reg_var), !!as.name(ud_var), variable)
  } else if (length(reg_var) == 0 & length(ud_var) > 0) {
    desc_dat_num <- desc_dat_num %>%
      group_by(!!as.name(ud_var), variable)
  } else {
    desc_dat_num <- desc_dat_num %>%
      group_by(variable)
  }
  
  desc_dat_num <- desc_dat_num %>% summarize(
    breaks = hist(
      value,
      breaks = seq(min(value, na.rm = TRUE),
                   max(value, na.rm = TRUE),
                   length.out = num_breaks),
      plot = FALSE
    )$breaks,
    counts = c(hist(
      value,
      breaks = seq(min(value, na.rm = TRUE),
                   max(value, na.rm = TRUE),
                   length.out = num_breaks),
      plot = FALSE
    )$counts,
    NA_integer_)
  )
  
  ## Factors
  desc_dat_fac <- desc_dat %>%
    dplyr::select_if(is.factor) %>%
    gather(key = "variable",
           value = "value",
           -any_of(reg_var),
           -any_of(ud_var))
  
  if (ncol(desc_dat_fac) > 0L & 
      any(not(names(desc_dat_fac) %in% c(reg_var, ud_var)))) {
    if (length(reg_var) > 0 & length(ud_var) == 0) {
      desc_dat_fac <- desc_dat_fac %>%
        group_by(!!as.name(reg_var), variable)
    } else if (length(reg_var) > 0 & length(ud_var) > 0) {
      desc_dat_fac <- desc_dat_fac %>%
        group_by(!!as.name(reg_var), !!as.name(ud_var), variable)
    } else if (length(reg_var) == 0 & length(ud_var) > 0) {
      desc_dat_num <- desc_dat_num %>%
        group_by(!!as.name(ud_var), variable)
    } else {
      desc_dat_fac <- desc_dat_fac %>%
        group_by(variable)
    }
    desc_dat_fac <- desc_dat_fac %>% summarize(
      levels = names(table(value)),
      counts = as.integer(table(value))
    )
  } else {
    desc_dat_fac <- NULL
  }
  
  ## Return
  return(bind_rows(desc_dat_num, desc_dat_fac))
}
